/**
 * 模拟数据工具
 * 为前端提供完整的模拟数据，完全复制数据库中的真实数据
 */

// 模拟图书分类数据 - 根据数据库中的真实分类创建
export const mockCategories = [
  // 首页默认分类，包含所有图书
  { id: 0, name: '全部', bookCount: 11, icon: 'icon-all', createTime: '2024-03-15 10:00:00' },
  // 数据库中的真实分类
  { id: 1, name: '科幻小说', bookCount: 1, icon: 'icon-tech', createTime: '2024-03-15 10:30:00' },
  { id: 2, name: '外国文学', bookCount: 2, icon: 'icon-book', createTime: '2024-03-15 10:35:00' },
  { id: 3, name: '中国当代文学', bookCount: 2, icon: 'icon-book', createTime: '2024-03-15 10:40:00' },
  { id: 4, name: '奇幻文学', bookCount: 1, icon: 'icon-magic', createTime: '2024-03-15 10:45:00' },
  { id: 5, name: '历史小说', bookCount: 0, icon: 'icon-history', createTime: '2024-03-15 10:50:00' },
  { id: 6, name: '成长小说', bookCount: 1, icon: 'icon-growth', createTime: '2024-03-15 10:55:00' },
  { id: 7, name: '计算机科学', bookCount: 3, icon: 'icon-computer', createTime: '2024-03-15 11:00:00' },
  { id: 8, name: '编程语言', bookCount: 1, icon: 'icon-code', createTime: '2024-03-15 11:05:00' },
  { id: 9, name: '软件工程', bookCount: 1, icon: 'icon-software', createTime: '2024-03-15 11:10:00' }
];

// 数据库中的真实图书数据
export const realBooks = [
  // 三体图书数据
  {
    id: 1,
    title: '三体',
    author: '刘慈欣',
    publisher: '重庆出版社',
    cover_url: '/static/images/books/three-body.jpg',
    description: '科幻小说，描述人类文明与三体文明的首次接触。文化大革命如火如荻进行的同时，军方探寻外星文明的绝密计划“红岸工程”取得了突破性进展。但在按下发射键的那一刻，历经劫难的叶文洁没有意识到，她彻底改变了人类的命近。',
    rating: 4.9,
    sales: 12000000,
    status: 1,
    publication_date: '2008-01-01',
    price: 59.80,
    discount: 0.85,
    category_ids: [1], // 科幻小说
    create_time: '2024-05-01 09:30:00',
    update_time: '2024-05-01 09:30:00',
    is_hot: true,
    is_new: true
  },
  // 百年孤独图书数据
  {
    id: 2,
    title: '百年孤独',
    author: '加西亚·马尔克斯',
    publisher: '南海出版公司',
    cover_url: '/static/images/books/one-hundred-years.jpg',
    description: '拉丁美洲魔幻现实主义文学的代表作，讲述了布恩迪亚家族七代人的传奇故事，以及他们所居住的马孔多镇的兴衰。这部作品被公认为是20世纪最伟大的西班牙语小说之一，对世界文学产生了深远的影响。',
    rating: 4.8,
    sales: 8500000,
    status: 1,
    publication_date: '1967-05-30',
    price: 49.50,
    discount: 0.9,
    category_ids: [2], // 外国文学
    create_time: '2024-05-03 14:20:00',
    update_time: '2024-05-03 14:20:00',
    is_hot: true,
    is_new: false
  },
  // 平凡的世界图书数据
  {
    id: 3,
    title: '平凡的世界',
    author: '路遥',
    publisher: '人民文学出版社',
    cover_url: '/static/images/books/ordinary-world.png',
    description: '这是一部全景式地表现中国当代城乡社会生活的长篇小说，全书共三部。作品通过复杂的矛盾纠葳，以孙少平等人物的困难选择和人生转折，展示了普通人在大时代历史进程中所走过的艺难曲折的道路。',
    rating: 4.9,
    sales: 10000000,
    status: 1,
    publication_date: '1986-01-01',
    price: 68.00,
    discount: 0.8,
    category_ids: [3], // 中国当代文学
    create_time: '2024-04-15 10:25:00',
    update_time: '2024-04-15 10:25:00',
    is_hot: true,
    is_new: false
  },
  // 哈利·波特与魔法石图书数据
  {
    id: 4,
    title: '哈利·波特与魔法石',
    author: 'J.K.罗琳',
    publisher: '人民文学出版社',
    cover_url: '/static/images/books/harry-potter-1.jpg',
    description: '这是《哈利·波特》系列的第一部。11岁的孤儿哈利·波特在霍格沃茨魔法学校度过了不平凡的一年。在那里，他结交了终身挥友，发现了魔法世界的惊人秘密以及隐藏的命运。',
    rating: 4.8,
    sales: 15000000,
    status: 1,
    publication_date: '1997-06-26',
    price: 32.50,
    discount: 0.85,
    category_ids: [4], // 奇幻文学
    create_time: '2024-02-20 16:40:00',
    update_time: '2024-02-20 16:40:00',
    is_hot: true,
    is_new: false
  },
  // 活着图书数据
  {
    id: 5,
    title: '活着',
    author: '余华',
    publisher: '作家出版社',
    cover_url: '/static/images/books/to-live.jpg',
    description: '《活着》讲述了农村人福贵悲惨的人生遇遇。福贵本是个阔少爷，却因赌博而一贫如洗，失去了家族的财产，妻子家珍也因此生活艺难。随着内战、三反五反、大跃进、文化大革命等社会变革，福贵的悲惨命运就如同一个缩影，展现了在急剧变革的时代中小人物的命运。',
    rating: 4.7,
    sales: 7000000,
    status: 1,
    publication_date: '1992-01-01',
    price: 38.00,
    discount: 0.8,
    category_ids: [3], // 中国当代文学
    create_time: '2024-03-10 11:15:00',
    update_time: '2024-03-10 11:15:00',
    is_hot: true,
    is_new: false
  },
  // 追风笼的人图书数据
  {
    id: 6,
    title: '追风笼的人',
    author: '卡勒德·胡赛尼',
    publisher: '上海人民出版社',
    cover_url: '/static/images/books/kite-runner.jpg',
    description: '故事从1970年代的阿富汗嗨布尔开始，讲述了富家少爷阿米尔与仁人哈桑之间的友谊、背叛与救赎。这部作品不仅是一个关于友谊的动人故事，也是对阿富汗历史、文化和人性的深刻探索。',
    rating: 4.8,
    sales: 9000000,
    status: 1,
    publication_date: '2003-05-29',
    price: 45.00,
    discount: 0.85,
    category_ids: [2, 6], // 外国文学, 成长小说
    create_time: '2024-01-25 09:45:00',
    update_time: '2024-01-25 09:45:00',
    is_hot: true,
    is_new: false
  },
  // Java编程思想图书数据
  {
    id: 7,
    title: 'Java编程思想',
    author: 'Bruce Eckel',
    publisher: '机械工业出版社',
    cover_url: '/static/images/books/thinking-in-java.jpg',
    description: '本书赞述了Java语言的基本概念，详细介绍了对象元素、控制流程、数据类型、方法、类、接口、数组、注解和泛型等知识点，以及异常处理、容器、IO、并发、网络和图形界面等高级应用知识。是一本全面系统地阐述Java编程思想的经典之作。',
    rating: 4.9,
    sales: 2500000,
    status: 1,
    publication_date: '2007-03-15',
    price: 108.00,
    discount: 0.8,
    category_ids: [7, 8], // 计算机与互联网, 编程语言
    create_time: '2024-02-05 08:30:00',
    update_time: '2024-02-05 08:30:00',
    is_hot: true,
    is_new: false
  },
  // 深入理解计算机系统图书数据
  {
    id: 8,
    title: '深入理解计算机系统',
    author: 'Randal E. Bryant',
    publisher: '机械工业出版社',
    cover_url: '/static/images/books/csapp.jpg',
    description: '本书介绍了计算机系统的基本概念，包括程序的机器级表示、处理器架构、编译器优化提高性能、内存层次结构、链接、异常控制流、虚拟内存和并发等，并且全书基于Linux系统和零组织结构，以实际程序和硬件系统为例子。',
    rating: 4.9,
    sales: 2000000,
    status: 1,
    publication_date: '2016-01-01',
    price: 129.00,
    discount: 0.9,
    category_ids: [7, 10], // 计算机与互联网, 系统架构
    create_time: '2024-01-10 15:45:00',
    update_time: '2024-01-10 15:45:00',
    is_hot: true,
    is_new: true
  }
];

// 生成模拟图书数据的方法
export function generateMockBooks(count = 10) {
  // 使用真实的计算机类图书数据，避免重复创建已有图书
  const computerBooks = [
    // 使用realBooks中已有的深入理解计算机系统 (id: 8)
    
    {
      id: 9,
      title: '算法导论',
      author: 'Thomas H. Cormen',
      publisher: '机械工业出版社',
      cover_url: '/static/images/books/algorithm.png',
      description: '算法领域的经典教材，系统介绍了各种常用算法的设计和分析方法，以及复杂度理论和NP完全性理论，是计算机科学学习的必备参考书。',
      rating: 4.8,
      sales: 9000,
      status: 1,
      publication_date: '2009-07-01',
      price: 119.00,
      discount: 0.85,
      category_ids: [7], // 计算机科学
      create_time: '2024-02-15 09:30:00',
      update_time: '2024-02-15 09:30:00',
      is_hot: true,
      is_new: false
    },
    {
      id: 10,
      title: 'JavaScript高级程序设计',
      author: 'Nicholas C. Zakas',
      publisher: '人民邮电出版社',
      cover_url: '/static/images/books/js.jpg',
      description: 'JavaScript权威指南，全面深入地介绍了JavaScript语言的核心特性和高级技巧，涵盖了ES6及后续版本的新特性和最佳实践。',
      rating: 4.7,
      sales: 8000,
      status: 1,
      publication_date: '2019-12-01',
      price: 99.00,
      discount: 0.8,
      category_ids: [8], // 编程语言
      create_time: '2024-03-05 14:20:00',
      update_time: '2024-03-05 14:20:00',
      is_hot: true,
      is_new: false
    },
    {
      id: 11,
      title: '设计模式',
      author: 'Erich Gamma',
      publisher: '机械工业出版社',
      cover_url: '/static/images/books/design-pattern.jpg',
      description: '软件开发必读经典，介绍了23种设计模式及其在面向对象软件开发中的应用，帮助开发者编写更加灵活、可维护和可扩展的代码。',
      rating: 4.6,
      sales: 7000,
      status: 1,
      publication_date: '2003-09-01',
      price: 89.00,
      discount: 0.85,
      category_ids: [9], // 软件工程
      create_time: '2024-04-10 11:40:00',
      update_time: '2024-04-10 11:40:00',
      is_hot: false,
      is_new: false
    },
    {
      id: 12,
      title: '数据结构与算法分析',
      author: 'Mark Allen Weiss',
      publisher: '机械工业出版社',
      cover_url: '/static/images/books/data-structure.jpg',
      description: '数据结构经典教材，系统讲解了各种数据结构的概念、实现和应用，以及常见算法的分析方法，是计算机科学专业学生的必读书籍。',
      rating: 4.5,
      sales: 6000,
      status: 1,
      publication_date: '2014-05-01',
      price: 79.00,
      discount: 0.8,
      category_ids: [7], // 计算机科学
      create_time: '2024-05-20 10:15:00',
      update_time: '2024-05-20 10:15:00',
      is_hot: false,
      is_new: true
    }
  ];
  
  // 添加真实书籍数据（避免重复）
  const books = [];
  // 添加realBooks中的深入理解计算机系统（id=8）
  books.push(realBooks[realBooks.length - 1]); // 深入理解计算机系统
  
  // 添加新增的计算机书籍
  books.push(...computerBooks);
  
  // 如果需要更多数据，则基于已有书籍生成变种
  if (count > books.length) {
    const baseId = Math.max(...books.map(book => book.id)) + 1; // 从最大ID开始递增
    const coverPrefix = 'https://picsum.photos/id/';
    
    // 以现有计算机书籍为模板，生成更多变种
    for (let i = 0; i < count - books.length; i++) {
      // 从已有书籍随机选择一本作为模板
      const template = books[Math.floor(Math.random() * books.length)];
      const randomId = Math.floor(Math.random() * 1000);
      
      books.push({
        id: baseId + i,
        title: `${template.title} (第${i+1}版)`,
        author: template.author,
        publisher: template.publisher,
        cover_url: `${coverPrefix}${(randomId % 100) + 1}/300/400`,
        description: `${template.description} 本次新版增加了更多实用案例和练习。`,
        rating: (parseFloat(template.rating) - Math.random() * 0.3).toFixed(1),
        sales: Math.floor(template.sales * (0.7 + Math.random() * 0.6)),
        status: 1,
        publication_date: `202${Math.floor(Math.random() * 5)}-${String(Math.floor(Math.random() * 12) + 1).padStart(2, '0')}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')}`,
        price: (parseFloat(template.price) * (0.9 + Math.random() * 0.2)).toFixed(2),
        discount: (Math.random() * 0.3 + 0.7).toFixed(2),
        category_ids: template.category_ids,
        create_time: `2024-0${Math.floor(Math.random() * 6) + 1}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')} ${String(Math.floor(Math.random() * 24)).padStart(2, '0')}:${String(Math.floor(Math.random() * 60)).padStart(2, '0')}:${String(Math.floor(Math.random() * 60)).padStart(2, '0')}`,
        update_time: `2024-0${Math.floor(Math.random() * 6) + 1}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')} ${String(Math.floor(Math.random() * 24)).padStart(2, '0')}:${String(Math.floor(Math.random() * 60)).padStart(2, '0')}:${String(Math.floor(Math.random() * 60)).padStart(2, '0')}`,
        is_hot: Math.random() > 0.5,
        is_new: Math.random() > 0.7
      });
    }
  }
  
  return books.slice(0, count);
}

// 模拟热门图书数据 - 使用realBooks数组中的真实数据
export const mockHotBooks = realBooks.filter(book => {
  // 选择评分较高的书作为热门图书
  return parseFloat(book.rating) >= 4.7;
}).map(book => {
  // 将销量提高以突出热门属性
  return {
    ...book,
    is_hot: true,
    sales: Math.max(book.sales, 8000000) // 确保销量足够高
  };
});

// 模拟新上架图书数据 - 使用realBooks数组中的真实数据
export const mockNewBooks = realBooks.map(book => {
  // 生成最近30天内的随机日期
  const now = new Date();
  const randomDays = Math.floor(Math.random() * 30);
  const newDate = new Date(now.getTime() - randomDays * 24 * 60 * 60 * 1000);
  
  return {
    ...book,
    is_new: true,
    publication_date: newDate.toISOString().split('T')[0],
    update_time: newDate.toISOString().replace('T', ' ').split('.')[0]
  };
});

// 模拟个人推荐图书数据 - 使用realBooks数组中的真实数据
export const mockPersonalRecommendations = realBooks.map(book => {
  // 添加个性化推荐原因
  const reasons = [
    '根据您的阅读喜好推荐',
    '与您最近阅读的书籍相似',
    '该作者的作品受到广泛好评',
    '该领域的经典之作'
  ];
  
  let recommendReason;
  if (book.category_ids?.includes(7) || book.category_ids?.includes(8) || book.category_ids?.includes(9)) {
    // 计算机类书籍的专属推荐理由
    recommendReason = '适合程序员和计算机爱好者的经典书籍';
  } else {
    // 随机选择一个一般性的推荐理由
    recommendReason = reasons[Math.floor(Math.random() * reasons.length)];
  }
  
  return {
    ...book,
    reason: recommendReason,
    match_score: Math.floor(Math.random() * 20 + 80) // 80-100的匹配度
  };
});

// 模拟评分分布数据 - 基于realBooks中图书的实际评分
export const mockRatingDistribution = (() => {
  // 初始化评分分布对象
  const distribution = {
    5: 0,
    4: 0,
    3: 0,
    2: 0,
    1: 0
  };
  
  // 基于真实图书评分生成分布数据
  realBooks.forEach(book => {
    const rating = Math.round(parseFloat(book.rating)); // 四舍五入到最接近的整数
    const baseCount = Math.floor(book.sales / 1000); // 根据销量估算评分数量
    
    // 根据评分添加到相应分级
    if (rating >= 1 && rating <= 5) {
      distribution[rating] += baseCount;
    }
  });
  
  // 将分布对象转换为数组格式并增加随机波动
  return Object.entries(distribution).map(([rating, count]) => {
    // 增加随机波动，使数据更自然
    const randomFactor = 0.8 + Math.random() * 0.4; // 0.8-1.2之间的随机数
    return {
      rating: parseInt(rating),
      count: Math.max(10, Math.floor(count * randomFactor)) // 确保至少10个评分
    };
  }).sort((a, b) => b.rating - a.rating); // 按评分降序排列
})();

// 模拟销售排行数据 - 基于realBooks真实数据
export const mockSalesRanking = [...realBooks].sort((a, b) => b.sales - a.sales);

// 模拟热门关键词数据 - 基于realBooks中图书的分类和内容
export const mockHotKeywords = (() => {
  // 不同类型图书相关的关键词
  const keywordData = [
    // 文学类
    { keyword: '小说', count: 0, categories: [1, 2, 3, 4, 5, 6] },
    { keyword: '科幻', count: 0, categories: [1] },
    { keyword: '外国文学', count: 0, categories: [2] },
    { keyword: '当代文学', count: 0, categories: [3] },
    { keyword: '奇幻', count: 0, categories: [4] },
    { keyword: '历史', count: 0, categories: [5] },
    { keyword: '成长', count: 0, categories: [6] },
    
    // 计算机类
    { keyword: '计算机', count: 0, categories: [7, 8, 9] },
    { keyword: '编程', count: 0, categories: [8] },
    { keyword: 'JavaScript', count: 0, categories: [8] },
    { keyword: '设计模式', count: 0, categories: [9] },
    { keyword: '算法', count: 0, categories: [7] },
    { keyword: '数据结构', count: 0, categories: [7] },
    { keyword: '系统架构', count: 0, categories: [7] }
  ];
  
  // 遍历realBooks中的每本书，累计关键词数量
  realBooks.forEach(book => {
    const categoryIds = book.category_ids || [];
    const bookContribution = Math.floor(book.sales / 10000) || 100; // 根据销量计算关键词热度贡献值
    
    // 对每个关键词检查并更新计数
    keywordData.forEach(keywordItem => {
      if (categoryIds.some(catId => keywordItem.categories.includes(catId))) {
        keywordItem.count += bookContribution;
        
        // 特殊关键词匹配（标题中包含关键词的额外加分）
        if (book.title.includes(keywordItem.keyword) || 
            (book.description && book.description.includes(keywordItem.keyword))) {
          keywordItem.count += Math.floor(bookContribution * 0.5);
        }
      }
    });
  });
  
  // 返回排序后的前10个热门关键词
  return keywordData
    .sort((a, b) => b.count - a.count)
    .slice(0, 10)
    .map(item => ({
      keyword: item.keyword,
      count: item.count
    }));
})();

// 模拟市场趋势数据 - 基于realBooks图书销售数据
export function mockMarketTrend(granularity = 'day') {
  const now = new Date();
  const result = {
    totalSales: 0,
    averageSales: 0,
    growth: 0,
    details: []
  };
  
  // 根据粒度定义时间范围和数据点数
  let dataPoints = 7;
  let format = '';
  let timeUnit = 24 * 60 * 60 * 1000; // 默认为天的毫秒数
  
  switch (granularity) {
    case 'day':
      dataPoints = 7;
      format = 'MM-dd';
      timeUnit = 24 * 60 * 60 * 1000; // 一天
      break;
    case 'week':
      dataPoints = 10;
      format = '第ww周';
      timeUnit = 7 * 24 * 60 * 60 * 1000; // 一周
      break;
    case 'month':
      dataPoints = 12;
      format = 'yyyy-MM';
      timeUnit = 30 * 24 * 60 * 60 * 1000; // 约一个月
      break;
    case 'quarter':
      dataPoints = 8;
      format = 'yyyy年第Q季度';
      timeUnit = 90 * 24 * 60 * 60 * 1000; // 约一季度
      break;
    case 'year':
      dataPoints = 5;
      format = 'yyyy年';
      timeUnit = 365 * 24 * 60 * 60 * 1000; // 约一年
      break;
  }
  
  // 生成时间区间
  const timeRanges = [];
  for (let i = dataPoints - 1; i >= 0; i--) {
    const endDate = new Date(now.getTime() - i * timeUnit);
    const startDate = new Date(endDate.getTime() - timeUnit);
    
    let periodText = '';
    switch (granularity) {
      case 'day':
        periodText = `${endDate.getMonth() + 1}-${endDate.getDate()}`;
        break;
      case 'week':
        periodText = `第${Math.floor(endDate.getDate() / 7) + 1}周`;
        break;
      case 'month':
        periodText = `${endDate.getFullYear()}-${endDate.getMonth() + 1}`;
        break;
      case 'quarter':
        periodText = `${endDate.getFullYear()}年第${Math.floor(endDate.getMonth() / 3) + 1}季度`;
        break;
      case 'year':
        periodText = `${endDate.getFullYear()}年`;
        break;
    }
    
    timeRanges.push({
      startDate,
      endDate,
      period: periodText,
      sales: 0
    });
  }
  
  // 根据realBooks中的图书销售数据生成趋势
  let totalBookSales = realBooks.reduce((sum, book) => sum + book.sales, 0);
  let averageSalePerBook = totalBookSales / realBooks.length;
  
  // 模拟不同时间点的销售数据
  timeRanges.forEach((range, index) => {
    // 初始销售基数
    const baseSales = Math.floor(averageSalePerBook / 30) * realBooks.length; // 估算天均销量
    
    // 增长因素 - 后期销售更好
    const growthFactor = 0.85 + (index / (timeRanges.length - 1)) * 0.3; // 0.85-1.15的递增趋势
    
    // 季节性因素 - 根据月份波动
    const month = range.endDate.getMonth();
    let seasonFactor = 1.0;
    if ([11, 0, 1].includes(month)) { // 冬季/年底销量高
      seasonFactor = 1.2;
    } else if ([5, 6, 7].includes(month)) { // 夏季销量低
      seasonFactor = 0.85;
    } else if ([8, 9].includes(month)) { // 开学季销量高
      seasonFactor = 1.15;
    }
    
    // 随机波动因素
    const randomFactor = 0.9 + Math.random() * 0.2; // 0.9-1.1的随机波动
    
    // 计算最终销售数据
    const sales = Math.floor(baseSales * growthFactor * seasonFactor * randomFactor);
    range.sales = sales;
  });
  
  // 计算增长率
  const details = timeRanges.map((range, index) => {
    let growth = 0;
    if (index > 0) {
      growth = ((range.sales - timeRanges[index - 1].sales) / timeRanges[index - 1].sales * 100).toFixed(1);
    }
    
    return {
      period: range.period,
      sales: range.sales,
      growth
    };
  });
  
  // 统计总销售额和平均值
  const totalSales = details.reduce((sum, item) => sum + item.sales, 0);
  result.details = details;
  result.totalSales = totalSales;
  result.averageSales = Math.floor(totalSales / dataPoints);
  
  // 计算整体增长率
  const firstSales = details[0].sales;
  const lastSales = details[details.length - 1].sales;
  result.growth = ((lastSales - firstSales) / firstSales * 100).toFixed(1);
  
  return result;
}
